/**
 * 给你一个长度固定的整数数组 arr ，请你将该数组中出现的每个零都复写一遍，并将其余的元素向右平移。

注意：请不要在超过该数组长度的位置写入元素。请对输入的数组 就地 进行上述修改，不要从函数返回任何东西。
 */

#include <common.h>

class Solution
{
public:
    void duplicateZeros(std::vector<int> &arr)
    {
        int cur = 0, dest = -1;
        for (; cur < arr.size(); cur++)
        {
            if (arr[cur] == 0)
            {
                dest += 2;
            }
            else
            {
                ++dest;
            }
            if (dest >= arr.size() - 1)
                break;
        }

        //
        if (dest == arr.size())
        {
            arr[dest - 1] = 0;
            dest -= 2;
            --cur;
        }

        while (cur >= 0)
        {
            if (arr[cur] == 0)
            {
                arr[dest--] = 0;
                arr[dest--] = 0;
            }
            else
            {
                arr[dest--] = arr[cur];
            }
            --cur;
        }
    }
};

// practice
class Solution
{
public:
    Solution() {}

    void duplicateZeros(std::vector<int> &arr)
    {
        int dest = -1, cur = 0;
        int sz = arr.size();
        for (; cur < sz; ++cur)
        {
            (arr[cur] == 0) ? dest += 2 : ++dest;
            if (dest >= sz - 1)
                break;
        }

        if (dest == sz)
        {
            arr[dest - 1] = 0;
            dest -= 2;
            --cur;
        }

        while (cur >= 0)
        {
            if (arr[cur] == 0)
            {
                arr[dest--] = 0;
                arr[dest--] = 0;
            }
            else
            {
                arr[dest--] = arr[cur];
            }
            --cur;
        }
    }

    ~Solution() {}
};

class Solution
{
public:
    void duplicateZeros(vector<int> &arr)
    {
        int dest = -1, cur = 0;
        for (; cur < arr.size(); cur++)
        {
            arr[cur] == 0 ? dest += 2 : dest++;
            if (dest >= arr.size() - 1)
                break;
        }
        if (dest == arr.size())
        {
            arr[--dest] = 0;
            dest--;
            cur--;
        }
        while (cur >= 0)
        {
            if (!arr[cur])
            {
                arr[dest--] = 0;
                arr[dest--] = 0;
            }
            else
            {
                arr[dest--] = arr[cur];
            }
            cur--;
        }
    }
};